package net.hands.common;

import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 说明:抽象算法工具
 * <br>
 * <p>这是一个开源的软件，请在LGPLv3下合法使用、修改或重新发布。</p>
 * @author 陈侃(cknet@126.com, 13910090885)
 *         http://code.google.com/p/simpleframework/
 *         http://www.simpleframework.net
 */
public abstract class AlgorithmUtils {
	/**
	* 符串解码为字节数组 做了null判断
	* @param encoded 编码
	* @return byte[] 字节数组
	* @update 2012-9-22 下午10:51:28
	 */
	public static byte[] base64Decode(final String encoded) {
		return encoded == null ? null : Base64.decode(encoded);
	}
   /**
   * 字节数组编码后转字符 null判断
   * @param binaryData 字节数组
   * @return String
   * @update 2012-9-22 下午11:03:44
    */
	public static String base64Encode(final byte[] binaryData) {
		return binaryData == null ? null : Base64.encodeToString(binaryData);
	}
	static final int BUFFER = 8 * 1024;
	public static String md5Hex(final InputStream inputStream) throws IOException {
		if (inputStream == null) {
			return null;
		}
		try {
			final MessageDigest digest = MessageDigest.getInstance("MD5");
			final byte[] buf = new byte[BUFFER];
			for (;;) {
				final int numRead = inputStream.read(buf);
				if (numRead == -1) {
					break;
				}
				digest.update(buf);
			}
			return StringUtils.encodeHex(digest.digest());
		} catch (final NoSuchAlgorithmException e) {
			return null;
		}
	}
   /**
   * 字节数组通过MD5算法获得md5加密字符
   * @param bytes 字节
   * @return String
   * @update 2012-9-22 下午11:04:44
    */
	public static String md5Hex(final byte[] bytes) {
		try {
			final MessageDigest digest = MessageDigest.getInstance("MD5");
			digest.update(bytes);
			return StringUtils.encodeHex(digest.digest());
		} catch (final NoSuchAlgorithmException e) {
			return null;
		}
	}
   /**
   * 字符串通过md5算法获得md5加密字符
   * @param message 信息
   * @return String
   * @update 2012-9-22 下午11:05:59
    */
	public static String md5Hex(final String message) {
		return md5Hex(message.getBytes());
	}
}
